# PageResultWindower.java

    package org.codefilarete.stalactite.spring.repository.query.execution.reduce;

    import java.util.List;
    import java.util.function.LongSupplier;
    import java.util.function.Supplier;

    import org.codefilarete.stalactite.spring.repository.query.projection.PartTreeStalactiteCountProjection;
    import org.codefilarete.stalactite.spring.repository.query.StalactiteRepositoryQuery;
    import org.springframework.data.support.PageableExecutionUtils;

    /**
     * {@link QueryResultWindower} dedicated to {@link org.springframework.data.domain.Page} result.
     *
     * @param <C>
     * @param <R>
     * @param <P>
     * @author Guillaume Mary
     */
    public class PageResultWindower<C, R, P> extends QueryResultWindower<C, R, P> {

    	public PageResultWindower(StalactiteRepositoryQuery<C, ?> delegate,
    							  LimitHandler limitHandler,
    							  PartTreeStalactiteCountProjection<C> countQuery,
    							  Supplier<List<P>> resultSupplier) {
    		super(delegate,
    				limitHandler,
    				(accessor, result)
    						-> (R) PageableExecutionUtils.getPage(result, accessor.getPageable(), () -> countQuery.execute(accessor.getValues())),
    				resultSupplier);
    	}

    	public PageResultWindower(StalactiteRepositoryQuery<C, ?> delegate,
    							  LimitHandler limitHandler,
    							  LongSupplier countQuery,
    							  Supplier<List<P>> resultSupplier) {
    		super(delegate,
    				limitHandler,
    				(accessor, result)
    						-> (R) PageableExecutionUtils.getPage(result, accessor.getPageable(), countQuery),
    				resultSupplier);
    	}
    }